// 按需导入chooseAddress方法
import { chooseAddress, showModal, showToast } from '../../utils/chooseAddress.js'
// 默认导入的方式导入runtime.js文件 让其可以使用async和await关键字
import regeneratorRuntime from '../../lib/runtime/runtime.js'
Page({
  data: {
    address: {},
    // 购物车数组数据
    cart: [],
    // 全选按钮的选中状态
    allChecked: false,
    // 商品的总价格
    totalPrice: 0, 
    // 商品的总数量
    totalNum: 0
  },
  // 当用户点击添加地址按钮的时候触发
  async handleAddress() {
    // wx.chooseAddress({
    //   success: (result) => {
    //     console.log(result)
    //   },
    //   fail: () => { },
    //   complete: () => { }
    // });
    let result = await chooseAddress()
    console.log(result);
    // 给地址添加一个属性all放具体的地址字符串的拼接
    result.all = result.provinceName + result.cityName + result.countyName + result.detailInfo
    // 把获取到的用户的收货地址保存到本地中去
    wx.setStorageSync('address', result);
  },
  onShow() {
    // 在页面一上来的时候就拿到缓存中的数据address并赋值给data中的address
    const address = wx.getStorageSync('address')
    // 在页面一上来的时候拿到缓存中的购物车数组数据cart，赋值给data中的cart空数组
    const cart = wx.getStorageSync("cart") || [];

    // 直接调用setCart函数
    this.setCart(cart)
    // 把地址数据放到data中
    this.setData({
      address
    })

    //  对cart使用every方法进行遍历 得到全选按钮的选中状态
    // const allChecked = cart.length ? cart.every(v => v.checked) : false
    // 对cart使用forEach遍历计算商品的总价格和总数量
    // let totalPrice = 0
    // let totalNum = 0
    // let allChecked = true
    // cart.forEach(v => {
    //   if (v.checked) {
    //     // 商品被选中的时候 计算
    //     totalPrice += v.num * v.goods_price
    //     totalNum += v.num
    //   } else {
    //     // 商品没有被选中的时候 让allChecked为fasle
    //     allChecked = false
    //   }
    // })
    // // 解决cart为空数组的时候 allChecked为false
    // allChecked = cart.length ? allChecked : false
    // this.setData({
    //   address,
    //   cart,
    //   allChecked,
    //   totalPrice,
    //   totalNum
    // })

  },
  // 当商品的复选框发生改变的时候
  handleItemchange(e) {
    // console.log(e)
    // 拿到传递过来的商品id
    const goods_id = e.currentTarget.dataset.id
    // 获取到cart
    const cart = this.data.cart
    // 根据goods_id来找到被改变商品的索引
    const index = cart.findIndex(v => v.goods_id === goods_id)
    // console.log(index);
    // 根据索引来修改被点击的商品的checked属性 修改选中状态
    cart[index].checked = !cart[index].checked

    // 直接调用setCart函数
    this.setCart(cart)

    // // 把最新的cart放到data中和本地缓存中
    // this.setData({
    //   cart
    // })
    // wx.setStorageSync("cart", cart)

    // // 重新的计算底部的全选复选框的选中状态、商品总价、商品数量 直接复制上面写过的 代码
    // let totalPrice = 0
    // let totalNum = 0
    // let allChecked = true
    // cart.forEach(v => {
    //   if (v.checked) {
    //     // 商品被选中的时候 计算
    //     totalPrice += v.num * v.goods_price
    //     totalNum += v.num
    //   } else {
    //     // 商品没有被选中的时候 让allChecked为fasle
    //     allChecked = false
    //   }
    // })
    // // 解决cart为空数组的时候 allChecked为false
    // allChecked = cart.length ? allChecked : false
    // this.setData({
    //   allChecked,
    //   totalPrice,
    //   totalNum
    // })


  },
  // 封装一个函数setCart 用来实现底部工具栏的三个功能并把数据放到data中；以及把cart放到缓存中
  setCart(cart) {
    let totalPrice = 0
    let totalNum = 0
    let allChecked = true
    cart.forEach(v => {
      if (v.checked) {
        // 商品被选中的时候 计算
        totalPrice += v.num * v.goods_price
        totalNum += v.num
      } else {
        // 商品没有被选中的时候 让allChecked为fasle
        allChecked = false
      }
    })
    // 解决cart为空数组的时候 allChecked为false
    allChecked = cart.length ? allChecked : false
    this.setData({
      cart,
      allChecked,
      totalPrice,
      totalNum
    })
    // 把cart放到缓存中
    wx.setStorageSync("cart", cart)
  },
  // 点击全选复选框的时候触发
  handleItemAllcheck() {
    // 获取到data中的cart和allChecked
    let { cart, allChecked } = this.data
    // 对allChecked进行取反操作
    allChecked = !allChecked
    // 遍历cart 修改每一项的checked 为 allChecked的值
    cart.forEach(v => v.checked = allChecked)
    // 调用setCart方法
    this.setCart(cart)
  },
  // 当点击了商品的加号或者减号的时候触发
  async handleEditNum(e) {
    // 拿到传递过来的两个参数
    let { id, operation } = e.currentTarget.dataset
    // 把字符串operaton转化为数字类型的
    operation = operation - 0
    // console.log(typeof (operation));
    // 获取到data中的cart
    const cart = this.data.cart
    // 根据id来获取到cart中的被点击商品的索引
    const index = cart.findIndex(v => id === v.goods_id)

    // 当商品的数量为1并且点击的是减号的时候进行弹窗提示判断
    if (cart[index].num === 1 && operation === -1) {
      // wx.showModal({
      //   title: '提示',
      //   content: '您确认要删除该商品吗',
      //   success: (result) => {
      //     if (result.confirm) {
      //       // console.log('用户点击了确认按钮');
      //       // 用户点击了确定按钮，把这个商品从cart数组中删除掉
      //       cart.splice(index, 1)
      //       // 重新更新数据
      //       this.setCart(cart)
      //     } 
      //   }
      // });

      // 使用封装好的模态框函数
      const result = await showModal({ content: "你确定要删除该商品吗" })
      if (result.confirm) {
        cart.splice(index, 1)
        this.setCart(cart)
      }
    } else {
      // 当没有弹出模态框的时候，继续进行正常的操作
      // 根据索引来修改这个商品的数量
      cart[index].num += operation
      // 调用setCart更新数据
      this.setCart(cart)
    }
  },
  // 当用户点击了结算按钮的时候触发
  async handlePay() {
    // 从data中获取到收获地址和结算商品数量
    const { address, totalNum } = this.data
    // 如果用户没有选择收货地址
    if (!address.userName) {
      // 使用封装的弹窗提示函数
      await showToast({ title: "请选择收货地址" })
      // 阻止代码向下执行
      return
    }
    // 如果用户没有选择商品
    if (totalNum === 0) {
      // 使用封装的弹窗提示函数
      await showToast({ title: "请选择商品" })
      // 阻止代码向下执行
      return
    }
    // 代码能走到这一步，用户既选择了地址又选择了商品，可以进行跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/index'
    });

  }
})